/*********************************
* 学生选课系统
*********************************/

#define _CRT_SECURE_NO_WARNINGS

#include"main.h"
#include"struct.h"

/*添加选课信息*/
void selectCourse(pStudent student, pRecordList record_list, pCourseList course_list) {
    char course_id[128] = { 0 };
    int position = -1;
    Record record;
    memset(&record, 0, sizeof(Record));
    printf("#添加选课信息#\n");
    printf("输入课程编号：");
    scanf("%s", course_id);
    position = findCourseListByID(course_list, course_id);
    if (position != -1) {
        pCourse course = &course_list->data[position];
        if (course->people < course->limit) {
            if (findRecordListByStudentIDCourseID(record_list, student->id, course->id) == -1) {
                strcpy(record.student_id, student->id);
                strcpy(record.student_name, student->name);
                strcpy(record.course_id, course->id);
                strcpy(record.course_name, course->name);
                record.socre = course->score;
                addRecordList(record_list, &record);
                saveRecordFile(record_list);
                ++course->people;
                saveCourseFile(course_list);
                showRecordTitle();
                showRecord(&record);
                printf("---------------\n");
                printf("操作成功，成功添加以上选课选课信息！\n");
            } else {
                printf("操作失败，您已经选了这门课，不能重复选课！\n");
            }
        } else {
            printf("操作失败，该门课人数已达上限！\n");
        }
    } else {
        printf("操作失败，没有该课程！\n");
    }
}

/*取消选课信息*/
void unselectCourse(pStudent student, pRecordList record_list, pCourseList course_list) {
    char course_id[128] = { 0 };
    int position = -1;
    Record record;
    memset(&record, 0, sizeof(Record));
    printf("#取消选课信息#\n");
    printf("输入课程编号：");
    scanf("%s", course_id);
    position = findCourseListByID(course_list, course_id);
    if (position != -1) {
        pCourse course = &course_list->data[position];
        position = findRecordListByStudentIDCourseID(record_list, student->id, course->id);
        if (position != -1) {
            pRecord record = &record_list->data[position];
            showRecordTitle();
            showRecord(record);
            printf("---------------\n");
            printf("操作成功，成功删除以上选课选课信息！\n");
            removeRecordList(record_list, position);
            saveRecordFile(record_list);
            --course->people;
            saveCourseFile(course_list);
        } else {
            printf("操作失败，您没有选这门课！\n");
        }
    } else {
        printf("操作失败，没有该课程！\n");
    }
}

/*进入后台管理*/
void processAdmin(pStudentList student_list, pRecordList record_list, pCourseList course_list) {
    if (loginAdmin()) {
        /*循环菜单*/
        while (1) {
            int option;
            printf("╔----------------------------╗\n");
            printf("       $ 学生选课系统 - 管理 $\n");
            printf("  【1】 浏览学生信息\n");
            printf("  【2】 添加学生信息\n");
            printf("  【3】 修改学生信息\n");
            printf("  【4】 删除学生信息\n");
            printf("  【5】 搜索学生信息\n");
            printf("  【6】 浏览课程信息\n");
            printf("  【7】 添加课程信息\n");
            printf("  【8】 修改课程信息\n");
            printf("  【9】 删除课程信息\n");
            printf("  【10】 搜索课程信息\n");
            printf("  【11】 显示选课选课\n");
            printf("  【12】 查看操作日志\n");
            printf("  【0】 返回\n");
            printf("╚----------------------------╝\n");
            printf("       请选择：");
            scanf("%d", &option);
            if (option == 0) break;
            switch (option) {
            case 1:
                showStudentList(student_list);
                break;
            case 2:
                addStudent(student_list);
                break;
            case 3:
                updateStudent(student_list);
                break;
            case 4:
                removeStudent(student_list);
                break;
            case 5:
                searchStudent(student_list);
                break;
            case 6:
                showCourseList(course_list);
                break;
            case 7:
                addCourse(course_list);
                break;
            case 8:
                updateCourse(course_list);
                break;
            case 9:
                removeCourse(course_list);
                break;
            case 10:
                searchCourse(course_list);
                break;
            case 11:
                showRecordList(record_list, NULL);
            case 12:
                loadLog();
            }
        }
    }
}

/*进入学生登录*/
void processStudent(pStudentList student_list, pRecordList record_list, pCourseList course_list) {
    /*循环菜单*/
    pStudent student = loginStudent(student_list);
    if (student) {
        addLog(student->id, student->name, "登录");
        while (1) {
            int option;
            printf("╔----------------------------╗\n");
            printf("       $ 学生选课系统 - 学生 $\n");
            printf("  【1】 浏览课程信息\n");
            printf("  【2】 搜索课程信息\n");
            printf("  【3】 显示选课选课\n");
            printf("  【4】 添加选课选课\n");
            printf("  【5】 取消选课选课\n");
            printf("  【0】 返回\n");
            printf("╚----------------------------╝\n");
            printf("       请选择：");
            scanf("%d", &option);
            if (option == 0) break;
            switch (option) {
            case 1:
                showCourseList(course_list);
                break;
            case 2:
                searchCourse(course_list);
                break;
            case 3:
                showRecordList(record_list, student->id);
                break;
            case 4:
                selectCourse(student, record_list, course_list);
                addLog(student->id, student->name, "添加选课");
                break;
            case 5:
                unselectCourse(student, record_list, course_list);
                addLog(student->id, student->name, "取消选课");
                break;
            }
        }
    }
}

/*进入程序*/
void process(pStudentList student_list, pRecordList record_list, pCourseList course_list) {
    /*从文件中加载课程信息*/
    loadStudentFile(student_list);
    /*从文件中加载选课信息*/
    loadRecordFile(record_list);
    /*从文件中加载课程信息*/
    loadCourseFile(course_list);
    /*循环菜单*/
    while (1) {
        int option;
        printf("╔----------------------------╗\n");
        printf("       $ 学生选课系统 $\n");
        printf("  【1】 学生登录\n");
        printf("  【2】 后台管理\n");
        printf("  【0】 退出\n");
        printf("╚----------------------------╝\n");
        printf("       请选择：");
        scanf("%d", &option);
        if (option == 0) break;
        switch (option) {
        case 1:
            processStudent(student_list, record_list, course_list);
            break;
        case 2:
            processAdmin(student_list, record_list, course_list);
            break;
        }
    }
}

int main() {
    /*定义学生数组*/
    StudentList student_list;
    /*创建学生数组*/
    createStudentList(&student_list);
    /*定义选课数组*/
    RecordList record_list = { 0 };
    /*创建选课数组*/
    createRecordList(&record_list);
    /*定义课程数组*/
    CourseList course_list = { 0 };
    /*创建课程数组*/
    createCourseList(&course_list);
    /*进入程序*/
    process(&student_list, &record_list, &course_list);
    /*销毁选课数组*/
    destroyRecordList(&record_list);
    /*销毁课程数组*/
    destroyCourseList(&course_list);
    /*销毁学生数组*/
    destroyStudentList(&student_list);
    return 0;
}
